<?php
/**
 * Visionフレームワーククラス定義ファイル
 *
 * Visionフレームワーク本体及びオートロード関数が含まれています
 *
 */

/**
 * オートロード関数
 *
 * @param string $className クラス名
 */
function __autoload($className) {
	$classDir = VISION_APP_PATH.'classes';
	if (file_exists("$classDir/$className.php")) {
		require_once("$classDir/$className.php");
	} else {
		$errMsg = " $className クラスの呼び出しに失敗しました.<br />\n";
		$errMsg .= "[".$dir.$className.".php]が見つかりません.<br />\n";
		$errMsg .= "application.xml等の設定を確認して下さい.<br />\n";
		throw new Exception($errMsg);
	}
}

/**
 * Visionフレームワーク本体
 */
class Vision {
	/**
	 * アプリケーション設定を保持するオブジェクト
	 *
	 * @var SimpleXMLElement
	 */
	static public $setting;
	static function setGlobalVariables() {
		/**
		 * マルチバイト言語設定及び内部エンコーディングをUTF-8に設定
		 *
		 * 電子メールのエンコードはutf-8/base64が使用されます
		 */
		mb_language('uni');
		mb_internal_encoding('UTF-8');

		/**
		 * Visionの動作に必要なディレクトリパスの定義
		 */
		define("VISION_LIB_PATH", (string) self::$setting->path->vision->lib);
		define("VISION_APP_PATH", (string) self::$setting->path->vision->app);
		define("SMARTY_LIB_PATH", (string) self::$setting->path->smarty->lib);
		define("SMARTY_TMP_PATH", (string) self::$setting->path->smarty->tmp);
		define("VARDUMP_LIB_PATH", (string) self::$setting->path->vardump->lib);
		define("DEBUG_LOG_PATH", (string) self::$setting->path->debug->log);
	}
	static function loadCoreClasses() {
		/**
		 * Visionコアのインクルード
		 */
		require_once(VISION_LIB_PATH.'CommonFunc.php');
		require_once(VISION_LIB_PATH.'Controller.php');
		require_once(VISION_LIB_PATH.'Session.php');
		require_once(VISION_LIB_PATH.'Request.php');
		require_once(VISION_LIB_PATH.'Response.php');
//		require_once(VISION_LIB_PATH.'XMLDAO.php');
//		require_once(VISION_LIB_PATH.'Model.php');
		require_once(VISION_LIB_PATH.'DBConnector.php');
		require_once(VISION_LIB_PATH.'XMLModel.php');
		require_once(VISION_LIB_PATH.'AppProcess.php');
		require_once(VISION_LIB_PATH.'FormValidator.php');
		require_once(VISION_LIB_PATH.'Transformer.php');
		require_once(VISION_LIB_PATH.'FormHelper.php');
		require_once(VISION_LIB_PATH.'SmartyMail.php');
		
		// PEAR::VarDumpのインクルード
		require_once(VARDUMP_LIB_PATH.'Var_Dump.php');
	}
	/**
	 * 実行部
	 *
	 * 設定ファイルに基づきコアクラスをインスタンス化してコントローラにバインドする
	 *
	 * @param string $settingfile 設定ファイルのフルパス名
	 */
	static function execute($settingFile) {
		try {
			self::$setting = simplexml_load_file($settingFile, 'SimpleXMLElement');
			Vision::setGlobalVariables();
			Vision::loadCoreClasses();
			$controller = (string) self::$setting->classname->controller;
			$session = (string) self::$setting->classname->session;
			$request = (string) self::$setting->classname->request;
			$response = (string) self::$setting->classname->response;
			$main = new $controller(self::$setting, new $session(), new $request(), new $response());
			$main->execute();
		} catch(Exception $e) {
			$errorView = new $response();
			$errorView->assign('DBG_EXCEPTION_MSG','Vision Exception:'.$e->getMessage());
			$errorView->setTemplate('visionException.php');
			$errorView->output();
		}
	}
}
